/*
 * Copyright 2023-2085 xujin <ceo@itgrail.com>
 *
 * Licensed under the Grail License, Version 1.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * https://itgrail.com/docs?id=3&catalogId=87
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.itgrail.pilot.app.command.co;

import org.springframework.beans.BeanUtils;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

/**
 * @Author xujin
 * @create 2023/2/19 21:31
 *
 * VO 基础实现接口
 * @param <VO> VO 类
 * @param <DO> DO 类
 */
public class BaseVO<VO,DO> {
    /**
     * 根据DO创建VO
     * @param d DO 实例
     * @return VO实例
     */
    public VO createByDO(DO d) {
        VO vo = this.newInstance();
        assert vo != null;
        BeanUtils.copyProperties(d,vo);
        return vo;
    }

    private VO newInstance(){
        Type superclass = getClass().getGenericSuperclass();
        ParameterizedType parameterizedType = null;
        if (superclass instanceof ParameterizedType){
            parameterizedType = (ParameterizedType) superclass;
            Type[] types = parameterizedType.getActualTypeArguments();
            if (types !=null && types.length>0){
                Class aClass = (Class) types[0];
                VO vo = null;
                try {
                    vo = (VO) aClass.newInstance();
                    return vo;
                } catch (InstantiationException | IllegalAccessException e) {
                    e.printStackTrace();
                }
            }
        }
        return null;
    }
}
